#include "ble_hid_remote.h"
#include "bt_system.h"
#include "bt_debug.h"
#include "hal_gpio.h"
#include "hal_gpt.h"

static ble_hid_service_t g_hid_service;

// 按键处理函数
void handle_key_press(uint8_t key_code)
{
    hid_keys_t keys = {0};
    keys.keys[0] = key_code;
    
    bt_status_t status = ble_hid_keys_send(&g_hid_service, &keys);
    if (status != BT_STATUS_SUCCESS) {
        bt_debug_info("Failed to send HID report: %d", status);
    }
    
    // 按键释放
    hal_gpt_delay_ms(50);  // 按键持续时间
    keys.keys[0] = 0;  // 清除按键
    ble_hid_keys_send(&g_hid_service, &keys);
}

// 初始化GPIO
static void gpio_init(void)
{
    // 配置所有按键GPIO为输入，带上拉
    hal_gpio_init(GPIO_KEY_UP);
    hal_gpio_init(GPIO_KEY_DOWN);
    hal_gpio_init(GPIO_KEY_LEFT);
    hal_gpio_init(GPIO_KEY_RIGHT);
    hal_gpio_init(GPIO_KEY_PHOTO);
    hal_gpio_init(GPIO_KEY_VIDEO);
    hal_gpio_init(GPIO_KEY_CONFIRM);
    hal_gpio_init(GPIO_KEY_BACK);
    hal_gpio_init(GPIO_KEY_PREV);
    hal_gpio_init(GPIO_KEY_NEXT);
    
    hal_gpio_set_direction(GPIO_KEY_UP, HAL_GPIO_DIRECTION_INPUT);
    hal_gpio_set_direction(GPIO_KEY_DOWN, HAL_GPIO_DIRECTION_INPUT);
    hal_gpio_set_direction(GPIO_KEY_LEFT, HAL_GPIO_DIRECTION_INPUT);
    hal_gpio_set_direction(GPIO_KEY_RIGHT, HAL_GPIO_DIRECTION_INPUT);
    hal_gpio_set_direction(GPIO_KEY_PHOTO, HAL_GPIO_DIRECTION_INPUT);
    hal_gpio_set_direction(GPIO_KEY_VIDEO, HAL_GPIO_DIRECTION_INPUT);
    hal_gpio_set_direction(GPIO_KEY_CONFIRM, HAL_GPIO_DIRECTION_INPUT);
    hal_gpio_set_direction(GPIO_KEY_BACK, HAL_GPIO_DIRECTION_INPUT);
    hal_gpio_set_direction(GPIO_KEY_PREV, HAL_GPIO_DIRECTION_INPUT);
    hal_gpio_set_direction(GPIO_KEY_NEXT, HAL_GPIO_DIRECTION_INPUT);
    
    // 使能上拉
    hal_gpio_pull_up(GPIO_KEY_UP);
    hal_gpio_pull_up(GPIO_KEY_DOWN);
    hal_gpio_pull_up(GPIO_KEY_LEFT);
    hal_gpio_pull_up(GPIO_KEY_RIGHT);
    hal_gpio_pull_up(GPIO_KEY_PHOTO);
    hal_gpio_pull_up(GPIO_KEY_VIDEO);
    hal_gpio_pull_up(GPIO_KEY_CONFIRM);
    hal_gpio_pull_up(GPIO_KEY_BACK);
    hal_gpio_pull_up(GPIO_KEY_PREV);
    hal_gpio_pull_up(GPIO_KEY_NEXT);
}

// 扫描按键
void scan_keys(void)
{
    // 检查每个按键
    if (hal_gpio_get_input(GPIO_KEY_UP) == 0) {
        handle_key_press(KEY_UP);
    }
    else if (hal_gpio_get_input(GPIO_KEY_DOWN) == 0) {
        handle_key_press(KEY_DOWN);
    }
    else if (hal_gpio_get_input(GPIO_KEY_LEFT) == 0) {
        handle_key_press(KEY_LEFT);
    }
    else if (hal_gpio_get_input(GPIO_KEY_RIGHT) == 0) {
        handle_key_press(KEY_RIGHT);
    }
    else if (hal_gpio_get_input(GPIO_KEY_PHOTO) == 0) {
        handle_key_press(KEY_PHOTO);
    }
    else if (hal_gpio_get_input(GPIO_KEY_VIDEO) == 0) {
        handle_key_press(KEY_VIDEO);
    }
    else if (hal_gpio_get_input(GPIO_KEY_CONFIRM) == 0) {
        handle_key_press(KEY_CONFIRM);
    }
    else if (hal_gpio_get_input(GPIO_KEY_BACK) == 0) {
        handle_key_press(KEY_BACK);
    }
    else if (hal_gpio_get_input(GPIO_KEY_PREV) == 0) {
        handle_key_press(KEY_PREV);
    }
    else if (hal_gpio_get_input(GPIO_KEY_NEXT) == 0) {
        handle_key_press(KEY_NEXT);
    }
    
    // 按键消抖
    hal_gpt_delay_ms(20);
}

// BLE事件处理函数
bt_status_t bt_app_event_callback(bt_msg_type_t msg, bt_status_t status, void *buff)
{
    switch (msg) {
        case BT_POWER_ON_CNF:
            // 蓝牙启动完成，开始广播
            bt_gap_le_start_advertiser();
            break;
            
        case BT_GAP_LE_CONNECT_IND:
            // 连接建立
            bt_gap_le_connection_ind_t *conn_ind = (bt_gap_le_connection_ind_t*)buff;
            g_hid_service.connection_handle = conn_ind->connection_handle;
            g_hid_service.is_notification_enabled = true;
            break;
            
        case BT_GAP_LE_DISCONNECT_IND:
            // 连接断开
            g_hid_service.connection_handle = 0;
            g_hid_service.is_notification_enabled = false;
            // 重新开始广播
            bt_gap_le_start_advertiser();
            break;
    }
    
    return BT_STATUS_SUCCESS;
}

int main(void)
{
    // 初始化系统
    system_init();
    
    // 初始化GPIO
    gpio_init();
    
    // 初始化蓝牙
    bt_system_init();
    
    // 初始化HID服务
    bt_status_t status = ble_hid_init(&g_hid_service);
    if (status != BT_STATUS_SUCCESS) {
        bt_debug_info("HID service init failed: %d", status);
        return -1;
    }
    
    // 主循环
    while (1) {
        // 扫描按键
        scan_keys();
        
        // 处理系统事件
        bt_system_process_event();
    }
    
    return 0;
} 